module uart_tx ( // 不考虑奇偶检验位   起始位（1bit）+数据位（8bit）+停止位（1bit)
    input  wire          sys_clk     ,
    input  wire          sys_rst_n   ,
    input  wire [7:0]    tx_data     ,   //需要发送的数据8bit
    input  wire          rx_vld      ,   //接收空闲位

    output wire          tx      //发送出去的数据
);
    
//定义波特率
parameter TIME_BAUD = 9'd434;//发送一个bit的数据需要多少个时钟周期 115200 57600 38400 19200 9600

//寄存器定义
reg [8:0] tx_data_r;//发送数据的中间寄存
reg       tx_flag;//开始发送数据的标志
reg       tx_r;//串行数据发送寄存 

//计数器的定义

//波特率计数器
reg [8:0] cnt_baud;
wire add_cnt_baud;
wire end_cnt_baud;//计满一次，意味着发送完成1bit数据

//bit计数器
reg [3:0] cnt_bit;
wire add_cnt_bit;
wire end_cnt_bit;//计满一次，完成一次数据发送，9bit

//处理数据，也就是需要发送的8bit的tx_data
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)begin
        tx_data_r <= 9'h1ff;
    end
    else if(rx_vld)begin
        tx_data_r <= {tx_data,1'b0};
    end
    else
        tx_data_r <= tx_data_r;
end

//约束tx_flag的值
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)begin
        tx_flag <= 1'b0;//高电平的时候代表开始发送，反之，停止发送
    end
    else if(rx_vld)begin//接收端告诉我们可以开始发送
        tx_flag <= 1'b1;
    end
    else if(end_cnt_bit)begin//一共9bit数据发送完成，结束发送
        tx_flag <= 1'b0;
    end
    else
        tx_flag <= tx_flag;
end

//波特率计数
always @(posedge sys_clk or negedge sys_rst_n)begin 
   if(!sys_rst_n)begin
        cnt_baud <= 9'd0;
    end 
    else if(add_cnt_baud)begin 
            if(end_cnt_baud)begin 
                cnt_baud <= 9'd0;
            end
            else begin 
                cnt_baud <= cnt_baud + 1'd1;
            end 
    end
   else  begin
       cnt_baud <= cnt_baud;
    end
end 

assign add_cnt_baud = tx_flag;//开始发送数据，则波特计数开始
assign end_cnt_baud = add_cnt_baud && cnt_baud == (TIME_BAUD - 1'd1);//计满波特率，则发送完成1bit数据

//bit计数
always @(posedge sys_clk or negedge sys_rst_n)begin 
   if(!sys_rst_n)begin
        cnt_bit <= 4'd0;
    end 
    else if(add_cnt_bit)begin 
            if(end_cnt_bit)begin 
                cnt_bit <= 4'd0;
            end
            else begin 
                cnt_bit <= cnt_bit + 1'd1;
            end 
    end
   else  begin
       cnt_bit <= cnt_bit;
    end
end 

assign add_cnt_bit = end_cnt_baud;
assign end_cnt_bit = add_cnt_bit && cnt_bit == 8;//一共9bit数据发送完成


always @(posedge sys_clk or negedge sys_rst_n) begin
       if (!sys_rst_n) begin
          tx_r <= 1'b1 ;
       end
       else if(cnt_baud==(TIME_BAUD>>1))begin
          tx_r <= tx_data_r[cnt_bit]  ;
       end
      else if(end_cnt_bit)begin
          tx_r <= 1'b1 ;
      end
  end

assign tx = tx_r;

endmodule